package com.qidian.zl.paper.service.impl;

import com.qidian.zl.paper.dao.AnswerDAO;
import com.qidian.zl.paper.dao.FieldDAO;
import com.qidian.zl.paper.dao.PaperDAO;
import com.qidian.zl.paper.factory.DAOFactory;
import com.qidian.zl.paper.pojo.Answer;
import com.qidian.zl.paper.pojo.Field;
import com.qidian.zl.paper.pojo.Paper;
import com.qidian.zl.paper.service.PaperService;
import com.qidian.zl.paper.util.StCache;
import com.qidian.zl.paper.util.StResult;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PaperServiceImpl implements PaperService {
    private PaperDAO paperDAO = DAOFactory.getPaperDAO();
    private AnswerDAO answerDAO = DAOFactory.getAnswerDAO();
    private FieldDAO fieldDAO = DAOFactory.getFieldDAO();

    @Override
    public Long saveOrUpdate(Paper paper) {
        Long paperId = -1L;
        if (new Long(-1).equals(paper.getPaperId())) {
            paperId = paperDAO.save(paper);
        } else {
            paperId = paperDAO.update(paper);
            //清空缓存
            String key="paper_"+paperId;
            StCache.clean(key);
        }

        return paperId;
    }

    @Override
    public List<Paper> query(int page, int size) {
        List<Paper> papers = new ArrayList<>();
        papers = paperDAO.query(page, size);
        return papers;
    }

    @Override
    public int queryTotal() {
        int result = -1;
        result = paperDAO.queryTotal();
        return result;
    }

    @Override
    public StResult queryByPage(int page, int size, Paper paper, String startTime, String endTime) {
        StResult result = StResult.ok("查询完成");
        int total = paperDAO.queryTotal(paper, startTime, endTime);
        result.setObj(total + "");
        List<Paper> papers = paperDAO.queryPaper(paper, startTime, endTime, page, size);
        result.setData(papers);

        return result;
    }

   /* @Override
    public List<Paper> queryPaperById(Paper paper, String startTime, String endTime, int page, int size) {
        List<Paper> papers=new ArrayList<>();
        papers=paperDAO.queryPaperById(paper,startTime,endTime,page,size);
        return papers;
    }*/

   /* @Override
    public int queryTotal(Paper paper, String startTime, String endTime) {
        int result=-1;
        result = paperDAO.queryTotal(paper,startTime,endTime);
        return result;
    }*/

    @Override
    public int delete(Long paperId) {
        int result = -1;
        result = paperDAO.delte(paperId);
        return result;
    }

    /**
     * 根据Id查询
     *
     * @param paperId
     * @return
     */
    @Override
    public Paper queryById(Long paperId) {
        Paper paper=null;
        //先从缓存中查询
        String key="paper_"+paperId;
        if (StCache.cache(key)){
            paper=StCache.get(key,Paper.class);
            return paper;
        }
        //查询数据库
        paper=paperDAO.queryById(paperId);
        StCache.put(key,paper);
        return  paper;
    }

    /**
     * 更新状态
     *
     * @param paperId
     * @return
     */
    @Override
    public int updateStatus(Long paperId,Integer status) {

        return paperDAO.updateStatus(paperId,status);
    }

    @Override
    public void subPaper(long paperId, List<Answer> answers) {
        // 保存answer列表
        int i = answerDAO.saveAnswers(answers);

        if (i > 0) {
            // 修改这个的paper的提交人数
            paperDAO.addSubCount(paperId, 1);
        }
    }

    /**
     * 查询 answer   根据相同的groupId
     * @param paperId
     * @return
     */
   /* public List<Map> queryAnswer(long paperId) {
        // 查询所有答案列表
        List<Answer> answers = answerDAO.qieryAnswerByPaperId(paperId);
        // 查询当前问卷中所有的域的列表(因为需要知道域的类型)
        List<Field> fields = fieldDAO.queryByPaperId(paperId);

        // 准备一个list，泛型是Map，这是最后返回的结果
        List<Map> result = new ArrayList<>();

        //整理数据
        // answers 就是查询所有答案列表，计划找到一个合适的数据之后，就取出并且删除这条数据
        while (answers.size() > 0) {
            // 等到answers没有数据，就退出循环
            // 准备一个map
            Map tempMap = new HashMap();
            // 取出第一个answer的groupId  目标是取出groupId相同的，组成一个map。
            String groupId = answers.get(0).getGroupId();

            //遍历列表
            for (int i = 0; i < answers.size(); i++) {
                // 取一个answer对象
                Answer a = answers.get(i);
                // 判断groupId是否和之前的groupId相同
                if (a.getGroupId().equals(groupId)) {
                    // 如果相同，说明是同一组的，就从列表中删除
                    answers.remove(i);
                    // 遍历的i要--
                    i--;
                    //取出的对象 操作
                    // 申明一个map中的key
                    String key = "";
                    //生成key
                    // 通过getFiledType(a.getFieldId(),fields) 获取fieldType
                    switch (getFiledType(a.getFieldId(), fields)) {
                        case 2:
                            // 单行文本
                            key = "text_" + a.getFieldId();
                            break;
                        case 3:
                            //多行文本
                            key = "textarea_" + a.getFieldId();
                            break;
                        case 4:
                            // 单选按钮
                            key = "radio_" + a.getFieldId();
                            break;
                        case 5:
                            // 多选按钮
                            key = "checkbox_" + a.getFieldId();
                            break;
                    }
                    // 以  key : value(答案文本)  形式将数据放入map
                    tempMap.put(key, a.getAnswerText());
                    // answertime
                    tempMap.put("answertime", a.getAnswerTime());
                    //
                    if (tempMap.size() - 1 == fields.size()) {
                        // 当一个map完成一个groupId的所有的数据之后，就退出for循环
                        break;
                    }
                }
            }
            //将map加入集合
            result.add(tempMap);
        }
        return result;
    }*/

    /**
     *
     * @param paperId
     * @param page
     * @param size
     * @return
     */
    @Override
    public StResult queryAnswer(long paperId, int page, int size) {
       //查询field 个数
        int filedCount=fieldDAO.queryByPaperId(paperId).size();
       //查询所有答案列表
        List<Answer> answers = answerDAO.qieryAnswerByPaperId(paperId, page, size*filedCount);//*fieldCount 就是查几个size个答案
        //查询当前所有域的列表
        List<Field> fields = fieldDAO.queryByPaperId(paperId);
        //准备一个list 存放结果
        List<Map> list=new ArrayList<>();

        while (answers.size()>0){
            //
            Map tempMap=new HashMap();
            //获取第一个groudId
            String groudId=answers.get(0).getGroupId();
            //
            for (int i=0;i<answers.size();i++){
                //获取一个对象
                Answer a=answers.get(i);
                if(a.getGroupId().equals(groudId)){
                    //移除 对象
                    answers.remove(i);
                    i--;
                    // key value
                    String key="";
                    switch (getFiledType(a.getFieldId(),fields)){
                        case 2:
                            // 单行文本
                            key="text_"+a.getFieldId();
                            break;
                        case 3:
                            //多行文本
                            key="textarea_"+a.getFieldId();
                            break;
                        case 4:
                            // 单选按钮
                            key="radio_"+a.getFieldId();
                            break;
                        case 5:
                            // 多选按钮
                            key="checkbox_"+a.getFieldId();
                            break;
                    }
                    tempMap.put(key,a.getAnswerText());
                    tempMap.put("answerTime",a.getAnswerTime());
                    tempMap.put("groupId",a.getGroupId());
                    // 当一个map完成一个groupId的所有的数据之后，就退出循环
                    if(tempMap.size()-2==fields.size()){
                        break;
                    }
                }

            }

            list.add(tempMap);

        }

        System.out.println(list);
        StResult stResult=StResult.ok();
        stResult.setData(list);

        //查询总条数
        int total = answerDAO.queryTotal(paperId) / (filedCount == 0 ? 1 : filedCount);
        stResult.setObj(total);


        return stResult;
    }

    // 根据fieldId和fileds获取对应域的类型
    private int getFiledType(long filedId, List<Field> fields) {
        for (Field field : fields) {
            if (field.getFieldId().equals(new Long(filedId))) {
                return field.getFieldType();
            }
        }
        return 0;
    }

}
